// 发布订阅模式，目前采用他的目的就是每次读取完毕都能做一些事
import fs from "fs"; // node中的文件系统模块
import { dirname, resolve } from "path";
import { fileURLToPath } from "url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

// 1）属性都操作完毕后，做一件事
// 2) 每个属性读取完毕后，最后输出

class EventEmitter {
  #arr = []; // es13的写法 私有变量
  #person = {};
  on(callback) {
    this.#arr.push(callback); // 让中介存储订阅的函数
  }
  emit(key, value) {
    this.#person[key] = value;
    this.#arr.forEach((fn) => fn(this.#person));
  }
}
const events = new EventEmitter();

events.on((person) => {
  console.log(person, "读取一次");
});
events.on((person) => {
  if (Reflect.ownKeys(person).length === 2) {
    console.log(person, "读取完毕");
  }
});
fs.readFile(resolve(__dirname, "age.txt"), "utf8", function (err, data) {
  events.emit("age", data);
});

fs.readFile(resolve(__dirname, "name.txt"), "utf8", function (err, data) {
  events.emit("name", data);
});

// 订阅（on）和发布 (emit) 解耦合 （订阅和发布之间没有关系的） 中介
// 多对多的关系

// 观察者模式 观察者和被观察者 （一对多的关系，内部含有发布订阅）
